#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<string.h>

#define NUM 128
#define CMD_NUM 64


int main()
{
  char command[NUM];
  for(;;){

    char *argv[CMD_NUM]={ NULL };
    
    //1.打印提示符号
    command[0]=0;
    printf("[jiantao@VM-4-2-centos myshell]#");
    fflush(stdout);

    //2.获取命令字符串
    fgets(command,NUM,stdin);
    command[strlen(command)-1]='\0';// ls\n\0 回车算一个字符,-1把回车去掉

    //3.解析命令字符串--分割字符串   
    const char* sep=" "; //设置一个分割符
    argv[0]=strtok(command,sep);
    int i=1;
    while(argv[i]=strtok(NULL,sep))//NULL 参数导致strtok在修改后的strToken中搜索下一个token
    {
      i++;
    }
  
   //4.检测命令是否是shell本身执行
   if(strcmp(argv[0],"cd")==0)
   {
     if(argv[1]!=NULL) chdir(argv[1]);
     continue;
   }
  
   //5.执行第三方命令
   if(fork()==0)
   {
     //child
     execvp(argv[0],argv); //ls -a -b
     exit(1);
   }
  
   int status=0;
   waitpid(-1,&status,0);//任意子进程非阻塞等待
   printf("exit code:%d\n",(status>>8)&0xFF);

  }
  return 0;
}
